// 路由参数
import { Controller, Get, Param, Post, Body, Res, Response } from '@nestjs/common'
import { 
    Response as ExpressResponse
 } from 'express'
@Controller("router-params")
export class RouterParamsController {
    // 路由参数
    @Get(':username/getUserInfo')
    getUserInfo(@Param() params: any, @Param('username') username): any {
        console.log(params)
        return params
    }

    // 多参数
    @Get(':username/getUserInfo/:age')
    getUserInfoAge(@Param() params: any, @Param('username') username): any {
        console.log(params)
        return params
    }

    // 通配符
    // 例如当前的路由 /router-params/abccccccccccccde   params结果为{0:cccccccccccc}
    @Get("ab*de")
    getWildcard(@Param() params: any): any {
        return params
    }

    // 获取Body信息,源码中添加中间件才可获取到body
    //  this.app.use(express.json())    //用来吧json格式的请求体对象放在req.body中
    // this.app.use(express.urlencoded({extends:true})) //吧form表单格式的请求对象放在req.body
    @Post("create")
    createUser(@Body() body: any,@Body('username') username:string): any {
        console.log(body,username)
        return body
    }


    // 响应装饰器response @Res/@Response
    @Get("res")
    resMethod(@Response() res:ExpressResponse):any{
        console.log(res)

        // 相当于自定义返回内容了，不走nestjs的封装
        res.send('123')
        return 'get Response'
    }

    // passthrough
    @Get("res-passthrough")
    resMethod2(@Response({passthrough:true}) res:ExpressResponse):any{
        // 有些时候，只想要添加一个响应头，仅此而已，我不想负责响应体的发送
        res.setHeader('key','value');
        // 还是想返回一个值，让Nestjs帮我处理,在装饰器@Response加参数passthrough：true
        return 'res-passthrough'
    }
}

/*
在使用nestjs时候，一般来说一个实体类会定义两个类型，一个是dto，一个是interface
dto：客户端向服务端提交的数据对象，比如说当用户注册的时候(用户名，密码)
然后服务端一般会获取次dto，然后保存到数据库中，保存的时候可能还会加入一些默认值，时间戳，对密码加密
还可能会过滤掉一些字段，比如注册的时候密码和确认密码，但是保存的时候只保存密码

数据库中保存的数据类型一般会定义一个interface
userDto{用户名，密码，确认密码，验证码}             用户客户端交互的
userInterface{用户名，密码，创建时间，更新时间}     存放最终数据的

在nestjs中dto用class去定义，可用来做校验等等
*/ 